package xim

import (
	"time"

	"gitee.com/xiaoyutab/xgotool/optional/xlog"
	"gitee.com/xiaoyutab/xgotool/optional/xnsq"
	"gitee.com/xiaoyutab/xgotool/xerror"
	"gitee.com/xiaoyutab/xgotool/xnum"
)

// 发送消息
//
//	m	要发送的消息信息
func CreateMessage(m *Message) error {
	if m.UserId == 0 {
		return xerror.New("用户未登录")
	}
	if m.DerviceId == 0 {
		return xerror.New("用户设备不能为0")
	}
	if m.ChatId == 0 {
		return xerror.New("聊天窗不能为空")
	}
	if !xnum.InArray(m.Type, []uint8{1, 2, 3, 4, 5}) {
		return xerror.New("暂不支持的消息类型")
	}
	if m.Type == 1 && m.Message == "" {
		return xerror.New("消息内容不允许为空")
	}
	if xnum.InArray(m.Type, []uint8{2, 3, 4}) && m.Fid == 0 {
		return xerror.New("消息内容不允许为空")
	}
	if m.Type == 5 {
		if m.Address == "" || m.AddressCity == 0 || m.Latitude <= 0 || m.Longitude <= 0 {
			return xerror.New("发送地址禁止为空，且暂不允许发送国际地址")
		}
	}
	if m.CreatedAt == "" {
		m.CreatedAt = time.Now().Format(time.DateTime)
	}
	// 存储消息到数据库中
	if _default.DB == nil {
		return xerror.New("数据库未连接")
	}
	// 查询聊天群是否存在
	_, err := GetChat(m.ChatId)
	if err != nil {
		return err
	}
	// 查询用户是否在该群中
	if err := CheckUserChat(m.UserId, m.ChatId); err != nil {
		return err
	}
	err = _default.DB.Table(_default.MessageTable).Create(m).Error
	if err != nil {
		return xlog.AE("消息记录插入失败", err)
	}
	// 发送到队列进行消息通知
	if _default.NsqMessageSend != "" {
		xnsq.Set(_default.NsqMessageSend, m)
	}
	return nil
}
